package com.wx.wechat.request;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Map;

import static com.wx.wechat.constant.WechatParameterName.WechatRequest.*;
import static com.wx.wechat.enums.status.WeChatEnumStatus.SignType.MD5;

/**
 * @author wx
 * @Description: 微信统一下单请求对象
 * @date 2018/10/31 003111:52
 */
@Data
public class Unifiedorder {
    /**
     * 签名类型
     */
    private String signType = MD5.getMessage();
    /**
     * 商品描述
     */
    private String 	body;

    /**
     * 商户订单号
     */
    private String outTradeNo;

    /**
     * 订单金额
     */
    private BigDecimal amount;

    /**
     * (待转换元转分)订单金额（交易金额默认为人民币交易，接口中参数支付金额单位为【分】，参数值不能带小数。对账单中的交易金额单位为【元】。
     * 外币交易的支付金额精确到币种的最小单位，参数值不能带小数点）
     */
    private int totalFee;

    /**
     * 终端IP
     */
    private String spbillCreateIp;

    /**
     * 异步通知地址
     */
    private String notifyUrl;
    /**
     * 交易类型 JSAPI 公众号支付/微信小程序支付 NATIVE 扫码支付 APP APP支付
     */
    private String tradeType;

    /**
     * 商品id  tradeType=NATIVE时（即扫码支付），此参数必传。此参数为二维码中包含的商品ID。
     */
    private String productId;

    /**
     * 微信用户标识tradeType=JSAPI时（即公众号支付/小程序支付），此参数必传。
     */
    private String openid;
    /**
     * 微信用子户标识 传sub_openid,则必须传sub_appid
     */
    private String subOpenid;

    /**
     * 初始化请求map参数
     */
    public Map<String, String> initRequestParameter( Map<String, String> requestParameterMap){
        if (StringUtils.isNotBlank(getBody())){
            requestParameterMap.put(REQUEST_BODY, getBody());
        }
        if (StringUtils.isNotBlank(getOutTradeNo())) {
            requestParameterMap.put(REQUEST_OUT_TRADE_NO, getOutTradeNo());
        }
        if (getTotalFee() > 0) {
            requestParameterMap.put(REQUEST_TOTAL_FEE, String.valueOf(getTotalFee()));
        }
        if (StringUtils.isNotBlank(getSpbillCreateIp())) {
            requestParameterMap.put(REQUEST_SPBILL_CREATE_IP, getSpbillCreateIp());
        }
        if (StringUtils.isNotBlank(getProductId())) {
            requestParameterMap.put(REQUEST_PRODUCT_ID, getProductId());
        }
        if (StringUtils.isNotBlank(getOpenid())){
            requestParameterMap.put(REQUEST_OPEN_ID, getOpenid());
        }
        if (StringUtils.isNotBlank(getSubOpenid())){
            requestParameterMap.put(REQUEST_SUB_OPENID, getSubOpenid());
        }
        if(StringUtils.isNotBlank(getTradeType())) {
            requestParameterMap.put(REQUEST_TRADE_TYPE, getTradeType());
        }
        if (StringUtils.isNotBlank(getNotifyUrl())) {
            requestParameterMap.put(REQUEST_NOTIFY_URL, getNotifyUrl());
        }
        if (StringUtils.isNotBlank(getSignType())) {
            requestParameterMap.put(REQUEST_SIGN_TYPE, getSignType());
        }
        return requestParameterMap;
    }

}
